昨天的水果例子用到「迭代」「條件判斷」和「參數提取器」,但我們沒有好好處理輸出,而是直接將迭代的「一坨輸出」秀在使用者面前,感覺挺糟的,接下來就看看在 Dify 中可以怎麼處理這種問題吧~
在介紹模板轉換之前,要先認識 Jinja2
如果你有用 flask 寫過後端程式碼,那一定會知道 render_template
這個函式
Jinja2 由奧地利的軟體工程師 Armin Ronacher 開發,他就是 Flask 這個 Web 框架的創建者,大佬等級的人物,Jinja2 就是一款「模板引擎」,很適合拿來開發網頁,因為他還支援 if/else, for loop 等功能,但 HTML 本身沒有這樣的功能。
你可以用 pip install Jinja2
來試玩看看
from jinja2 import Template
template = Template("Hello, {{ name }}!")
rendered = template.render(name="World")
print(rendered) # 輸出: Hello, World!
直觀的條件判斷和 for loop
from jinja2 import Template
template = Template("""
{% if users %}
<ul>
{% for user in users %}
<li>{{ user }}</li>
{% endfor %}
</ul>
{% else %}
<p>No users found.</p>
{% endif %}
""")
rendered = template.render(users=["Alice", "Bob", "Charlie"])
print(rendered)
rendered2 =
輸出
<ul>
<li>Alice</li>
<li>Bob</li>
<li>Charlie</li>
</ul>
<p>No users found.</p>
還可以用過濾器等功能
from jinja2 import Template
template = Template("Name: {{ name | upper }}")
rendered = template.render(name="john")
print(rendered) # 輸出: Name: JOHN
Jinja2 是個很強大的工具,但今天不會 focus 在這一塊,有興趣的可以參考官方文件
雖然昨天介紹水果的效果已經很好了,不過他只是將兩個字串拼接在一起
觀察日誌迭代的結果就會知道
但我比較希望可以讓使用者知道接下來介紹的是什麼水果,並且他的介紹文章是什麼,分開這兩個東東。在昨天的工作流中,接上一個建立一個模板轉換節點
用 Jinja2 語法,將水果名稱 (item) 和 LLM 的摘要同時顯示在一個字串中
記得一定要修改迭代的輸出
一樣用海狸大師吃水果來測試
我們也可以善用 jinja2 語法在迭代之外來做到一樣的事情
然後撰寫語法,這邊 loop.index0
表示從索引 0 開始計算
{% for summary in fruit_summaries %}
{{fruits_name[loop.index0]}}-{{ summary }}
{% endfor %}
如果你不熟 Jinja2 或者想要用 Python 和 Javascript 來做也可以歐。這邊我們設想一個情境:希望輸出的結果是 JSON 格式,以水果名稱為 key;水果介紹為 value
先新增一個代碼執行節點,接在迭代之後
設定輸入變數
寫程式
def main(summaries: str, names: str) -> dict:
output_dict = dict(zip(names, summaries))
return {
"result": output_dict,
}
指定輸出格式
注意:Dify 的代碼執行環境為了安全考量,不允許使用者作出可能消耗系統大量資源或者引發安全問題的操作,相對不彈性一點,如果真的有需要,就用 Day16 的方法自行撰寫 API,然後用「HTTP 請求」節點吧~
測試結果
只剩下「HTTP 請求」「變量聚合器」和「變量分配器」沒有被我們用到,不過如果你有跟著做到現在,應該也自行研究過這些東東了吧XD
明天應該會是 Chatflow 介紹的最後一天,Chatflow 跟 Workflow 真的蠻像的,只不過 Workflow 可以被當做一個節點使用。當專案大起來時,多人協作分配不同的人去處理不同的 case 十分方便~
明天我們來使用「HTTP 請求」串接一些好玩的 API 網站,搭配還沒用過的節點,期待一下吧!